Praktikum Visi Komputer

Modul ke-11

Augmented Reality

What is the premise of augmented reality?

Anda mungkin pernah melihat istilah "augmented reality" digunakan dalam berbagai konteks. Jadi, kita harus memahami premis augmented reality sebelum kita mulai membahas detail implementasinya. Augmented Reality mengacu pada superposisi input yang dihasilkan komputer seperti citra, suara, grafik, dan teks di atas dunia nyata.

Augmented reality mencoba mengaburkan batas antara apa yang nyata dan apa yang dihasilkan komputer dengan menggabungkan informasi secara mulus dan meningkatkan apa yang kita lihat dan rasakan. Ini sebenarnya terkait erat dengan konsep yang disebut realitas termediasi dimana komputer memodifikasi pandangan kita tentang realitas. Akibatnya, teknologi bekerja dengan meningkatkan persepsi kita saat ini tentang realitas. Sekarang tantangannya di sini adalah membuatnya terlihat mulus bagi pengguna. Sangat mudah untuk hanya melapisi sesuatu di atas video input, tetapi kita perlu membuatnya terlihat seperti bagian dari video. Pengguna harus merasa bahwa input yang dihasilkan komputer mengikuti dunia nyata. Inilah yang ingin kitai capai ketika kita membangun sebuah sistem augmented reality.

Penelitian visi komputer dalam konteks ini mengeksplorasi bagaimana kita dapat menerapkan citra yang dihasilkan komputer ke live video streaming sehingga kita dapat meningkatkan persepsi dunia nyata. Teknologi augmented reality memiliki beragam aplikasi diantaranya: tampilan yang dipasang di kepala, automobile, visualisasi data, game, konstruksi, dan sebagainya. Sekarang kita memiliki ponsel cerdas yang kuat dan mesin yang lebih cerdas, kita dapat membangun aplikasi augmented reality high-calss dengan mudah.

What does an augmented reality system look like?

Mari kita perhatikan gambar berikut:

image.png

Seperti yang bisa kita lihat di sini, kamera menangkap video dunia nyata untuk mendapatkan titik referensi. Sistem grafis menghasilkan objek virtual yang perlu dilapis di atas video. Sekarang blok penggabungan video adalah tempat semua keajaiban terjadi. Blok ini harus cukup pintar untuk memahami cara melapisi objek virtual di atas dunia nyata dengan cara sebaik mungkin.

Geometric transformations for augmented reality

Hasil augmented reality luar biasa, tetapi ada banyak hal matematika yang terjadi di bawahnya. Augmented reality menggunakan banyak transformasi geometris dan fungsi matematika terkait untuk memastikan semuanya terlihat mulus. Ketika berbicara tentang video langsung untuk augmented reality, kita perlu mendaftarkan objek virtual secara tepat di atas dunia nyata. Untuk memahaminya dengan lebih baik, mari kita anggap ini sebagai penyelarasan dua kamera, 1) kamera nyata yang digunakan untuk melihat dunia, dan 2) kamera virtual yang memproyeksikan objek grafis yang dihasilkan komputer.

Untuk membangun sistem augmented reality, transformasi geometris berikut perlu ditetapkan:

Perhatikan gambar berikut:

image.png

Seperti yang bisa kita lihat di sini, mobil itu mencoba masuk ke dalam scene tetapi terlihat sangat artifisial. Jika kita tidak mengubah koordinat dengan cara yang benar, maka hasilnya akan terlihat tidak wajar. Inilah yang kita bicarakan dalam transformasi objek-to-scene. Setelah kita mengubah koordinat 3D objek virtual menjadi bingkai koordinat dunia nyata, kita perlu memperkirakan pose kamera:

image-2.png

Kita perlu memahami posisi dan rotasi kamera karena itulah yang akan dilihat pengguna. Setelah kita memperkirakan pose kamera, kita siap untuk menempatkan adegan 3D ini pada gambar 2D.

image-3.png

Setelah kita memiliki transformasi ini, kita dapat membangun sistem yang lengkap.

What is pose estimation?

Sebelum kita melanjutkan, kita perlu memahami cara memperkirakan pose kamera. Ini adalah langkah yang sangat penting dalam sistem augmented reality dan kita harus melakukannya dengan benar jika kita ingin hasilnya mulus. Di dunia augmented reality, kita melapisi sebuah objek baru di atas objek asli secara real time. Untuk melakukan itu, kita perlu mengetahui lokasi dan orientasi kamera, dan kita perlu melakukannya dengan cepat. Di sinilah estimasi pose menjadi sangat penting. Jika kita tidak melacak pose dengan benar, maka objek baru tidak akan terlihat alami.

Perhatikan gambar berikut:

image.png

Garis panah menunjukkan bahwa permukaan normal. Katakanlah objek mengubah orientasinya:

image-2.png

Sekarang meskipun lokasinya sama, orientasinya telah berubah. Kita perlu memiliki informasi ini agar objek baru terlihat alami. Kita perlu memastikan bahwa itu selaras dengan orientasi dan posisi ini.

How to track planar objects?

Sekarang setelah Anda memahami apa itu estimasi pose, mari kita lihat bagaimana kita dapat menggunakannya untuk melacak objek planar. Mari kita perhatikan objek planar berikut:

image.png

Sekarang jika kita mengekstrak poin fitur dari gambar ini, kita akan melihat sesuatu seperti ini:

image-2.png

Mari kita miringkan kardusnya:

image-3.png

Seperti yang bisa kita lihat, kardus dimiringkan pada gambar ini. Sekarang jika kita ingin memastikan objek virtual kita terhampar di atas permukaan ini, kita perlu mengumpulkan informasi kemiringan planar ini. Salah satu cara untuk melakukannya adalah dengan menggunakan posisi relatif dari titik fitur tersebut. Jika kita mengekstrak titik fitur dari gambar sebelumnya, maka akan terlihat seperti ini:

image-4.png

Seperti yang kita lihat, titik fitur semakin dekat secara horizontal di ujung jauh bidang dibandingkan dengan yang di ujung dekat.

image-5.png

Jadi kita dapat memanfaatkan informasi ini untuk mengekstrak informasi orientasi dari gambar. Kita telah membahas transformasi perspektif secara mendetail ketika kita membahas transformasi geometris serta pencitraan panorama. Yang perlu kita lakukan adalah menggunakan kedua himpunan titik tersebut dan mengekstrak matriks homografinya. Matriks homografi ini akan memberi tahu kita bagaimana kardus berubah.

Perhatikan gambar berikut:

image-6.png

Kita mulai dengan memilih wilayah yang diminati.

image-7.png

Kita kemudian akan mengekstrak poin fitur dari wilayah yang diminati ini. Karena kita melacak objek planar, algoritma mengasumsikan bahwa wilayah yang diinginkan adalah bidang. Itu sudah jelas, tetapi lebih baik untuk menyatakannya secara eksplisit. Jadi, pastikan kita memiliki kardus di tangan kita saat memilih wilayah yang diminati ini. Selain itu, akan lebih baik jika kardus memiliki banyak pola dan titik-titik khas sehingga mudah untuk mendeteksi dan melacak titik-titik fitur di dalamnya. Biarkan pelacakan dimulai. Kita akan memindahkan kardus untuk melihat apa yang terjadi:

image-8.png

Seperti yang terlihat, poin fitur sedang dilacak di dalam wilayah yang diminati. Mari kita miringkan dan lihat apa yang terjadi:

image-9.png

Seperti yang kita lihat, poin fitur sedang dilacak dengan benar, persegi panjang yang dilapis mengubah orientasinya sesuai dengan permukaan kardus.

Di bawah ini coding untuk melakukannya:

What happened inside the code?

Untuk memulainya, kita memiliki kelas PoseEstimator yang melakukan semua pekerjaan berat di sini. Kita membutuhkan sesuatu untuk mendeteksi fitur dalam gambar dan sesuatu untuk mencocokkan fitur antara gambar yang berurutan. Jadi kita menggunakan pendeteksi fitur ORB dan pencocokan fitur Flann. Seperti yang bisa kita lihat, kita menginisialisasi kelas dengan parameter ini di konstruktor.

Setiap kali kita memilih wilayah yang diminati, kita memanggil metode add_target untuk menambahkannya ke daftar target pelacakan kita. Metode ini hanya mengekstrak fitur dari wilayah yang diinginkan dan menyimpannya di salah satu variabel kelas. Sekarang kita memiliki target, kita siap untuk melacaknya!

Metode track_target menangani semua pelacakan. Kita mengambil frame saat ini dan mengekstrak semua keypoint. Namun, kita tidak terlalu tertarik dengan semua keypoint dalam frame video saat ini. Kita hanya ingin keypoint dari target objek kita. Jadi sekarang, tugas kita adalah menemukan keypoint terdekat dalam frame saat ini.

Kita sekarang memiliki satu set keypoint dari frame saat ini dan kita memiliki satu set keypoint lain dari objek target kita di frame sebelumnya. Langkah selanjutnya adalah mengekstrak matriks homografi dari titik-titik pencocokan tersebut. Matriks homografi ini memberi tahu kita cara mengubah persegi panjang yang dihamparkan sehingga sejajar dengan permukaan kardus. Kita hanya perlu mengambil matriks homografi ini dan menerapkannya pada persegi panjang yang dilapis untuk mendapatkan posisi baru dari semua poinnya.

How to augment our reality?

Sekarang setelah kita tahu cara melacak objek planar, mari kita lihat cara melapisi objek 3D di atas dunia nyata. Objeknya adalah 3D tetapi video di layar kita adalah 2D. Jadi langkah pertama di sini adalah memahami cara memetakan objek 3D tersebut ke permukaan 2D agar terlihat realistis. Kita hanya perlu memproyeksikan titik 3D itu ke permukaan planar.

Mapping coordinates from 3D to 2D

Setelah kita memperkirakan pose, kita akan memproyeksikan poin dari 3D ke 2D. Perhatikan gambar berikut:

image.png

Seperti yang bisa kita lihat di sini, remote control TV adalah objek 3D tetapi kita melihatnya di bidang 2D. Sekarang jika kita memindahkannya, itu akan terlihat seperti ini:

image-2.png

Objek 3D ini masih berada pada bidang 2D. Objek telah pindah ke lokasi yang berbeda dan jarak dari kamera juga berubah. Bagaimana kita menghitung koordinat ini? Kita membutuhkan mekanisme untuk memetakan objek 3D ini ke permukaan 2D. Di sinilah proyeksi 3D ke 2D menjadi sangat penting. Kita hanya perlu memperkirakan pose kamera awal untuk memulai. Sekarang, mari kita asumsikan bahwa parameter intrinsik kamera sudah diketahui. Jadi kita bisa menggunakan fungsi solvePnP di OpenCV untuk memperkirakan pose kamera. Fungsi ini digunakan untuk memperkirakan pose objek menggunakan sekumpulan titik. Anda dapat membaca lebih lanjut tentang itu di https://docs.opencv.org/2.4/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html#bool%20solvePnP(InputArray%20objectPoints,%20InputArray%20imagePoints,%20InputArray%20cameraMatrix,%20InputArray%20distCoeffs,%20OutputArray%20rvec,%20OutputArray%20tvec,%20bool%20useExtrinsicGuess,%20int%20flags) Setelah kita melakukan ini, kita perlu memproyeksikan titik-titik ini ke 2D. Kita akan menggunakan projectPoints fungsi OpenCV untuk melakukan ini. Fungsi ini menghitung proyeksi titik-titik 3D tersebut ke bidang 2D.

How to overlay 3D objects on a video?

Sekarang kita siap untuk membangun sistem final. Katakanlah kita ingin melapisi piramida di atas kardus kita seperti yang ditunjukkan di sini:

image.png

Mari kita miringkan kardus untuk melihat apa yang terjadi:

image-2.png

Piramida mengikuti permukaan. Mari tambahkan target kedua:

image-3.png

Anda dapat terus menambahkan lebih banyak target dan semua piramida itu akan dilacak dengan baik. Mari kita lihat bagaimana melakukan ini menggunakan OpenCV Python. Pastikan untuk menyimpan file sebelumnya sebagai pose_estimation.py karena kita akan mengimpor beberapa kelas dari sana.

Let’s look at the code

class Tracker digunakan untuk melakukan semua perhitungan di sini. Kita menginisialisasi class dengan struktur piramida yang didefinisikan menggunakan edges (tepi) dan vertices (simpul). Logika yang kita gunakan untuk melacak permukaan sama dengan yang kita bahas sebelumnya karena kita menggunakan kelas yang sama. Kita hanya perlu menggunakan solvePnP dan projectPoints untuk memetakan piramida 3D ke permukaan 2D.

Let’s add some movements

Sekarang setelah kita tahu cara menambahkan piramida virtual, mari kita lihat apakah kita dapat menambahkan beberapa gerakan. Mari kita lihat bagaimana kita dapat mengubah ketinggian piramida secara dinamis. Ketika kita mulai, piramida akan terlihat seperti ini:

image.png

Jika kita menunggu beberapa saat, piramida menjadi lebih tinggi dan akan terlihat seperti ini:

image-2.png

Mari kita lihat bagaimana melakukannya di OpenCV Python. Di dalam kode augmented reality yang baru saja kita bahas, tambahkan cuplikan berikut di akhir metode init dalam Tracker class:

image-10.png

Sekarang kita memiliki struktur, kita perlu menambahkan kode untuk mengubah ketinggian secara dinamis. Ganti metode overlay_graphics() dengan metode berikut:

image-9.png

Sekarang kita tahu bagaimana mengubah ketinggian, mari kita lanjutkan dan membuat piramida menari untuk kita. Kita bisa membuat ujung piramida berosilasi dengan cara periodik yang bagus. Jadi ketika kita mulai akan terlihat seperti ini:

image-3.png

Jika kita menunggu beberapa saat, tampilannya akan seperti ini:

image-4.png

Lihat coding augmented_reality_motion.py untuk mengetahui detail implementasi.

Dalam percobaan kita berikutnya, kita akan membuat seluruh piramida bergerak di sekitar wilayah yang diinginkan. Kita bisa membuatnya bergerak dengan cara apapun yang kita inginkan. Mari kita mulai dengan menambahkan gerakan diagonal linier di sekitar wilayah yang kita pilih. Ketika Anda mulai, itu akan terlihat seperti ini:

image-5.png

Setelah beberapa waktu, akan terlihat seperti ini:

image-7.png

Lihat augmented_reality_dancing.py untuk melihat cara mengubah metode overlay_graphics() untuk membuatnya menari. Mari kita lihat apakah kita bisa membuat piramida berputar-putar di sekitar wilayah yang kita minati. Ketika Anda mulai, itu akan terlihat seperti ini:

image-6.png

Setelah beberapa waktu, itu akan pindah ke posisi baru:

image-8.png

Silahkan merujuk ke augmented_reality_circular_motion.py untuk melihat cara mewujudkannya. Kita dapat membuatnya melakukan apa pun yang kita inginkan. kita hanya perlu menemukan rumus matematika yang tepat dan piramida akan benar-benar menari mengikuti irama kita. Kita juga dapat mencoba objek virtual lain untuk melihat apa yang dapat kita lakukan dengannya. Ada banyak hal yang dapat kitalakukan dengan banyak objek yang berbeda. Contoh-contoh di atas memberikan referensi untuk kita membangun banyak aplikasi augmented reality yang menarik.

Penjelasan apa yang dimodifikasi dan hasil screenshoot (DI SINI)

Disini saya melakukan modifikasi pada code augmented_reality_circular_motion.py, yang hanya mengubah jalan gerak piramidanya. Pada code aslinya, piramida bergerak secara circular, pada code yang telah dimodifikasi ini piramida akan bergerak ke atas dan membentuk seperti elips. Berikut adalah hasil dari code yang sudah dimodifikasi.

ezgif.com-gif-maker